perm filename DCOPY.SAI[11,HE]1 blob
sn#546774 filedate 1980-11-23 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN "disk image copy program"
C00009 ENDMK
C⊗;
BEGIN "disk image copy program"
DEFINE CRLF="('15&'12)",
! = "COMMENT ",
TIL="STEP 1 UNTIL";
REQUIRE "11UTIL.HDR[11,SYS]" SOURCE_FILE;
DEFINE buflen = "'6000";
INTEGER bufadr,cyl,chan,brk,eof,cnt,flg,drv,sum,tmp,i,ck1,op;
SAFE INTEGER ARRAY foo[1:buflen];
STRING fname,s;
alinit;
chan ← getchan;
OPEN(chan,"DSK",'17,17,17,cnt,brk,eof);
WHILE TRUE DO BEGIN "loop"
PRINT("Read or Write (R/W): "); op ← IF (INCHWL LOR '40)="w" THEN TRUE ELSE FALSE;
PRINT("Disk name: "); fname ← inchwl; IF fname = NULL THEN CALL(0,"EXIT");
PRINT("Drive number: "); drv ← CVD(INCHWL);
POKE('1002,drv); ! Tell 11 which drive to use;
IF op THEN
BEGIN ! Get ready to Write out;
LOOKUP(chan,fname&".RSX",flg);
IF flg THEN BEGIN PRINT("Can't find file - aborted"&crlf); CONTINUE END;
PRINT("Type Y to confirm the write: "); IF (INCHWL LOR '40)≠"y" THEN CONTINUE;
POKE('1004,2); ! Tell 11 to start writing;
PRINT(crlf&"Starting write of: ",fname,crlf&" cyl: ");
SUM ← 0;
FOR cyl ← 1 TIL 203 DO
BEGIN
ARRYIN(chan,foo[1],buflen); ! Read it from disk;
FOR i ← 1 TIL buflen DO ! Compute the checksum;
Begin
TMP ← SUM + (SUM lsh 1);
SUM ← (SUM lsh 6) + (TMP lsh 2) + TMP + foo[i]
End;
WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Sleep for 1 tick;
IF bufadr LAND 1 THEN
BEGIN
PRINT("Disk Error while writing cylinder ",cyl-2,crlf);
CONTINUE "loop";
END;
POKEARRAY(bufadr,buflen,foo,TWRJ); ! Write the cylinder out;
POKE('1000,0); ! Tell 11 we're done with buffer;
IF (cyl MOD 20) = 0 THEN PRINT(cyl," ");
END;
WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Check 2nd last cyl was ok;
IF bufadr LAND 1 THEN
BEGIN
PRINT("Disk Error while writing cylinder 202"&crlf);
CONTINUE;
END;
POKE('1000,0); ! Tell 11 we're done with buffer;
WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Wait til 11 writes last cyl;
IF bufadr LAND 1 THEN
BEGIN
PRINT("Disk Error while writing cylinder 203"&crlf);
CONTINUE;
END;
POKE('1000,0); ! Tell 11 we're done with buffer;
CLOSE(chan);
ck1 ← sum;
PRINT(crlf&"Confirming the write" & crlf & " cyl: ");
END
ELSE
BEGIN
ENTER(chan,fname&".RSX",flg);
POKE('1004,1); ! Tell 11 to start reading;
PRINT(crlf&"Starting read of: ",fname,crlf&" cyl: ");
SUM ← 0;
FOR cyl ← 1 TIL 203 DO
BEGIN
WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Sleep for 1 tick;
IF bufadr LAND 1 THEN
BEGIN
PRINT("Disk Error while reading cylinder ",cyl-1,crlf);
CONTINUE "loop";
END;
PEEKARRAY(bufadr,buflen,foo,TWRJ); ! Read the cylinder in;
POKE('1000,0); ! Tell 11 we're done with buffer;
ARRYOUT(chan,foo[1],buflen); ! Store it to disk;
FOR i ← 1 TIL buflen DO ! Compute the checksum;
Begin
TMP ← SUM + (SUM lsh 1);
SUM ← (SUM lsh 6) + (TMP lsh 2) + TMP + foo[i]
End;
IF (cyl MOD 20) = 0 THEN PRINT(cyl," ");
END;
CLOSE(chan);
ck1 ← sum;
PRINT(crlf&"Confirming the read" & crlf & " cyl: ");
END;
POKE('1004,1); ! Tell 11 to start re-reading;
SUM ← 0;
FOR cyl ← 1 TIL 203 DO
BEGIN
WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Sleep for 1 tick;
IF bufadr LAND 1 THEN
BEGIN
PRINT("Disk Error while reading cylinder ",cyl,crlf);
CONTINUE "loop";
END;
PEEKARRAY(bufadr,buflen,foo,TWRJ); ! Read the cylinder in;
POKE('1000,0); ! Tell 11 we're done with buffer;
FOR i ← 1 TIL buflen DO ! Compute the checksum;
Begin
TMP ← SUM + (SUM lsh 1);
SUM ← (SUM lsh 6) + (TMP lsh 2) + TMP + foo[i]
End;
IF (cyl MOD 20) = 0 THEN PRINT(cyl," ");
END;
S ← "";
tmp ← abs(ck1);
While tmp neq 0 Do
Begin
S ← S & ("A" + (tmp mod 26));
tmp ← tmp div 26;
End;
IF ck1 = sum THEN PRINT(crlf & "Checksums match = ",S, " - Copy complete" & crlf)
ELSE
BEGIN
PRINT(crlf & "Checksums don't match - Error" & crlf);
S ← S & " ";
SUM ← abs(SUM);
While SUM neq 0 Do
Begin
S ← S & ("A" + (SUM mod 26));
SUM ← SUM div 26;
End;
PRINT(" The two checksums: ",S,crlf);
END;
END;
END;